Міністерство освіти і науки УкраїниНаціональний технічний університет України
«Київський політехнічний інститут ім. І. Сікорського»
Кафедра автоматизації проектування енергетичних процесів і систем
Лабораторна робота №8
з дисципліни «Операційні системи»
«Макрозасоби мови Асемблер»
Варіант №16
КИЇВ-2022
Мета: Вивчення макросів, макрокоманд та макророзширень та їхзастосування в асемблерних програмах.
Теоретична частина:
Обробка програми на асемблері з використанням макрозасобів неявно здійснюється транслятором у дві фази.
Макрозасоби Асемблера IBM PC мають три складові:
1. Макровизначення (макрос) – набір команд, який містить опис якоїсь дії або алгоритму. Макрос повинен знаходитися на початку програми, до визначення сегментів.
Синтаксис макровизначення:
ім’я_макроса MACRO [список_формальних_аргументів];тіло макровизначення
Endm
2. Макрокоманда – коротке посилання на макровизначення (виклик макроса):
ім’я_макроса MACRO [список_формальних_аргументів]
3. Макророзширення (макропідстановка, макровставка) – вставка замість макрокоманди макроса з заміною формальних параметрів на фактичні (якщо вони є).
Існує три варіанти де повинні розташовуватися макровизначення:
На початку тексту програми до сегмента коду та даних. Цей варіант використовується тоді, коли визначені користувачем макрокоманди є актуальними в межах однієї програми.
В окремому файлі. Такий варіант підходить при роботі з декількома програмами однієї проблемної області. Для того, щоб зробити доступними макровизначення у конкретній програмі, слід записати директиву include ім’я_файлу.
В макробібліотеці. Універсальні макрокоманди, які часто використовуються в програмах користувача, (наприклад, фрагменти програмної затримки, призупинення програми до натискання клавіші, перетворення двійкових чисел у символьну форму) доцільно записати в макробібліотеку. Макробібліотека являє собою файл з текстами макровизначень, які записуються у цей файл, як у текст програми. Файл макробібліотеки може мати будь-яке ім’я і розширення, наприклад, MYMACRO.MAC. В програмі залишаються тільки макровиклики.
Недоліком двох останніх способів є той факт, що у вихідний текст програми включаються абсолютно усі макровизначення. Для усунення цього недоліку використовується директива purge, в якості операндів через кому слід перелічити імена макрокоманд, які не повинні включатися в тіло програми.
Для організації циклу у макровизначенні мітку треба оголосити за допомогою оператора local.
LOCAL мітка... перераховує мітки, які застосовуватимуться усередині макроозначення, щоб не виникало помилки «мітка вже визначена» при використанні макросу більше одного разу або якщо та ж мітка присутня в основному тексті програми (в WASM директива LOCAL дозволяє використовувати макрос з мітками кілька разів, але не дозволяє застосовувати мітку з тим же ім'ям в програмі). Операнд для LOCAL мітка або список міток, які використовуватимуться в макросі.
Завдання:
Створіть максимальну можливу кількість макросів для вашої задачі та вставте у програму їх виклики.
Індивідуальні завдання:
16. В сегменті даних створити квадратну матрицю 5*5. Діагональні елементи піднести до другого ступеня.
Код для завдання 16 варіанту з коментарями:
; Хавкін А.Д. гр. ТР-15 , 16 варіант
; Макрозасоби
loadData macro
mov ax, Datas ; ініціалізація сегменту даних
mov ds, ax
endm
printNum macro ;виведення числа (елементу масиву)
local convtToDec
local printDec
xor cx, cx
mov bx, 10
convtToDec:
xor dx, dx
div bx
push dx
inc cx
test ax, ax
jnz convtToDec
mov ah, 02h
printDec:
pop dx
add dl, 30h
int 21h
loop printDec
endm
newLine macro;макрос для перехіду на наступний рядок
mov dx, offset CR_LF
mov ah, 09h
int 21h
endm
printSpace macro;макрос для виводу відстані між елементами масиву
mov ah, 02h
mov dl, 09h ;' '
int 21h
endm
printArr macro;виведення масиву на екран
local rows
local columns
local pos
local neg
local nextEl
xor si,si
xor cx,cx
mov cx,row
newLine
rows:
push cx
...